/**
 * @file 日期格式化工具函数
 * @description 提供日期相关格式化工具函数
 * @date 2024-06-15
 */

/**
 * 格式化日期为yyyy-MM-dd格式
 * @param date 日期对象或日期字符串
 * @returns 格式化后的日期字符串
 */
export function formatDate(date: Date | string | number): string {
  if (!date) return '';
  
  const d = typeof date === 'object' ? date : new Date(date);
  
  if (isNaN(d.getTime())) return '';
  
  return [
    d.getFullYear(),
    (d.getMonth() + 1).toString().padStart(2, '0'),
    d.getDate().toString().padStart(2, '0')
  ].join('-');
}

/**
 * 格式化时间为HH:mm:ss格式
 * @param time 日期对象或日期字符串
 * @returns 格式化后的时间字符串
 */
export function formatTime(time: Date | string | number | undefined): string {
  if (!time) return '--:--:--';
  
  const d = typeof time === 'object' ? time : new Date(time);
  
  if (isNaN(d.getTime())) return '--:--:--';
  
  return [
    d.getHours().toString().padStart(2, '0'),
    d.getMinutes().toString().padStart(2, '0'),
    d.getSeconds().toString().padStart(2, '0')
  ].join(':');
}

/**
 * 格式化日期时间为yyyy-MM-dd HH:mm:ss格式
 * @param date 日期对象或日期字符串
 * @returns 格式化后的日期时间字符串
 */
export function formatDateTime(date: Date | string | number): string {
  if (!date) return '';
  
  const d = typeof date === 'object' ? date : new Date(date);
  
  if (isNaN(d.getTime())) return '';
  
  const datePart = formatDate(d);
  const timePart = formatTime(d);
  
  return `${datePart} ${timePart}`;
}

/**
 * 格式化为友好时间，如"刚刚"、"5分钟前"等
 * @param date 日期对象或日期字符串
 * @returns 格式化后的友好时间
 */
export function formatFriendlyTime(date: Date | string | number): string {
  if (!date) return '';
  
  const d = typeof date === 'object' ? date : new Date(date);
  
  if (isNaN(d.getTime())) return '';
  
  const now = new Date();
  const diff = now.getTime() - d.getTime();
  
  // 小于1分钟
  if (diff < 60 * 1000) {
    return '刚刚';
  }
  
  // 小于1小时
  if (diff < 60 * 60 * 1000) {
    return `${Math.floor(diff / (60 * 1000))}分钟前`;
  }
  
  // 小于1天
  if (diff < 24 * 60 * 60 * 1000) {
    return `${Math.floor(diff / (60 * 60 * 1000))}小时前`;
  }
  
  // 小于30天
  if (diff < 30 * 24 * 60 * 60 * 1000) {
    return `${Math.floor(diff / (24 * 60 * 60 * 1000))}天前`;
  }
  
  // 超过30天，返回日期
  return formatDate(d);
}

/**
 * 将时间戳转换为Date对象
 * @param timestamp 时间戳（毫秒）
 * @returns Date对象
 */
export function timestampToDate(timestamp: number): Date {
  return new Date(timestamp);
}

/**
 * 获取两个日期之间的天数差
 * @param start 开始日期
 * @param end 结束日期
 * @returns 天数差
 */
export function getDaysBetween(start: string | number | Date, end: string | number | Date): number {
  const startDate = dayjs(start);
  const endDate = dayjs(end);
  return endDate.diff(startDate, 'day');
}

/**
 * 格式化持续时间（秒）
 * @param seconds 持续时间（秒）
 * @returns 格式化后的持续时间字符串
 */
export function formatDuration(seconds: number): string {
  if (typeof seconds !== 'number' || isNaN(seconds) || seconds < 0) {
    return '00:00:00';
  }
  
  const hours = Math.floor(seconds / 3600);
  const minutes = Math.floor((seconds % 3600) / 60);
  const secs = Math.floor(seconds % 60);
  
  return `${padZero(hours)}:${padZero(minutes)}:${padZero(secs)}`;
}

/**
 * 数字补零
 * @param num 需要补零的数字
 * @param length 补零后的长度，默认为2
 * @returns 补零后的字符串
 */
function padZero(num: number, length: number = 2): string {
  return String(num).padStart(length, '0');
}

/**
 * 获取当天的时间范围
 * @returns 包含开始和结束时间的对象
 */
export function getTodayRange(): { start: string, end: string } {
  const now = new Date();
  const today = now.toISOString().split('T')[0];
  return {
    start: `${today}T00:00:00`,
    end: now.toISOString()
  };
} 